﻿using SisGrafeno;
using System;
using System.Collections.Generic;
using System.Data.SqlClient;
using System.Linq;
using System.Text;

namespace SisGrafenoController
{
    public class SQLServerDAOCotizacion : DAOCotizacion
    {

        public void add(Cotizacion cot)
        {
            SqlConnection conn = null;
            try
            {
                //Paso 1 y 2: Registrar el driver y obtener la conexión
                conn = new SqlConnection();
                conn.ConnectionString = "Server=inti.lab.inf.pucp.edu.pe;" +
                    "Database=inf282;User ID=inf282;Password=inf282db;";
                conn.Open();

                //Paso 3. Preparar la sentencia
                SqlCommand comm = new SqlCommand();
                comm.Connection = conn;
                comm.CommandText = "INSERT INTO BooxCotizacion(id,fecha,montoTotal,estado,idNotaCredito,idCliente) VALUES (@param1,@param2,@param3,@param4,@param5,@param6)";
                SqlParameter param1 = new SqlParameter("@param1",
                                                        System.Data.SqlDbType.Int);
                SqlParameter param2 = new SqlParameter("@param2",
                                                        System.Data.SqlDbType.DateTime);
                SqlParameter param3 = new SqlParameter("@param3",
                                                        System.Data.SqlDbType.Float);
                SqlParameter param4 = new SqlParameter("@param4",
                                                        System.Data.SqlDbType.VarChar);
                SqlParameter param5 = new SqlParameter("@param5",
                                                        System.Data.SqlDbType.Int);
                SqlParameter param6 = new SqlParameter("@param6",
                                                        System.Data.SqlDbType.Int);


                param1.Value = cot.getId();
                param2.Value = cot.getFecha();
                param3.Value = cot.getMontoTotal();
                param4.Value = cot.getEstado();
                param5.Value = cot.getNotaCredito().getId();
                param6.Value = cot.getCliente().getId();

                comm.Parameters.Add(param1);
                comm.Parameters.Add(param2);
                comm.Parameters.Add(param3);
                comm.Parameters.Add(param4);
                comm.Parameters.Add(param5);
                comm.Parameters.Add(param6);

                //Paso 4. Ejecutar la sentencia
                comm.ExecuteNonQuery();
            }
            catch (Exception e)
            {
                // TODO Auto-generated catch block			
                Console.WriteLine(e.StackTrace); //Se debe manejar con logs

            }
            finally
            {
                //Paso 5. CERRAR LA CONEXIÓN!!!
                try { if (conn != null) conn.Close(); }
                catch (Exception e) { Console.WriteLine(e.StackTrace); }
            }
        }
        public void update(Cotizacion cot)
        {
            SqlConnection conn = null;
            try
            {
                //Paso 1 y 2: Registrar el driver y obtener la conexión
                conn = new SqlConnection();
                conn.ConnectionString = "Server=inti.lab.inf.pucp.edu.pe;" +
                    "Database=inf282;User ID=inf282;Password=inf282db;";
                conn.Open();

                //Paso 3. Preparar la sentencia
                SqlCommand comm = new SqlCommand();
                comm.Connection = conn;

 
                comm.CommandText = "UPDATE BooxCotizacion SET id=@param1, fecha=@param2, montoTotal=@param3, estado=@param4, idNotaCredito=@param5, idCliente=@param6";
                SqlParameter param1 = new SqlParameter("@param1",
                                                        System.Data.SqlDbType.Int);
                SqlParameter param2 = new SqlParameter("@param2",
                                                        System.Data.SqlDbType.DateTime);
                SqlParameter param3 = new SqlParameter("@param3",
                                                        System.Data.SqlDbType.Float);
                SqlParameter param4 = new SqlParameter("@param4",
                                                        System.Data.SqlDbType.VarChar);
                SqlParameter param5 = new SqlParameter("@param5",
                                                        System.Data.SqlDbType.Int);
                SqlParameter param6 = new SqlParameter("@param6",
                                                        System.Data.SqlDbType.Int);

                param1.Value = cot.getId();
                param2.Value = cot.getFecha();
                param3.Value = cot.getMontoTotal();
                param4.Value = cot.getEstado();
                param5.Value = cot.getNotaCredito().getId();
                param6.Value = cot.getCliente().getId();

                comm.Parameters.Add(param1);
                comm.Parameters.Add(param2);
                comm.Parameters.Add(param3);
                comm.Parameters.Add(param4);
                comm.Parameters.Add(param5);
                comm.Parameters.Add(param6);

                //Paso 4. Ejecutar la sentencia
                comm.ExecuteNonQuery();
            }
            catch (Exception e)
            {
                // TODO Auto-generated catch block			
                Console.WriteLine(e.StackTrace); //Se debe manejar con logs
                throw e;
            }
            finally
            {
                //Paso 5. CERRAR LA CONEXIÓN!!!!!
                try { if (conn != null) conn.Close(); }
                catch (Exception e) { Console.WriteLine(e.StackTrace); }
            }
        }
        public void delete(int cotizacionId)
        {
            SqlConnection conn = null;
            try
            {
                //Paso 1 y 2: Registrar el driver y obtener la conexión
                conn = new SqlConnection();
                conn.ConnectionString = "Server=inti.lab.inf.pucp.edu.pe;" +
                    "Database=inf282;User ID=inf282;Password=inf282db;";
                conn.Open();

                //Paso 3. Preparar la sentencia
                SqlCommand comm = new SqlCommand();
                comm.Connection = conn;

                comm.CommandText = "DELETE FROM BooxCotizacion " +
                                            " WHERE id=@param1";
                SqlParameter param1 = new SqlParameter("@param1",
                                                        System.Data.SqlDbType.Int);
                param1.Value = cotizacionId;

                comm.Parameters.Add(param1);

                //Paso 4. Ejecutar la sentencia
                comm.ExecuteNonQuery();
            }
            catch (Exception e)
            {
                // TODO Auto-generated catch block			
                Console.WriteLine(e.StackTrace); //Se debe manejar con logs
                throw e;
            }
            finally
            {
                //Paso 5. CERRAR LA CONEXIÓN!!!!
                try { if (conn != null) conn.Close(); }
                catch (Exception e) { Console.WriteLine(e.StackTrace); }
            }
        }
        public List<Cotizacion> queryAll()
        {
            List<Cotizacion> list = new List<Cotizacion>();
            SqlConnection conn = null;
            SqlDataReader myReader = null;
            try
            {
                //Paso 1 y 2: Registrar el driver y obtener la conexión
                conn = new SqlConnection();
                conn.ConnectionString = "Server=inti.lab.inf.pucp.edu.pe;" +
                    "Database=inf282;User ID=inf282;Password=inf282db;";
                conn.Open();

                //Paso 3. Preparar la sentencia
                SqlCommand comm = new SqlCommand();
                comm.Connection = conn;
                comm.CommandText = "SELECT * FROM BooxCotizacion";

                //Paso 4. Ejecutar la sentencia
                myReader = comm.ExecuteReader();

                //Paso 5: Evaluar los resultados
                while (myReader.Read())
                {
                    Cotizacion cot = new Cotizacion();
                    cot.setId(Int32.Parse(myReader["id"].ToString()));
                    cot.setFecha(DateTime.Parse(myReader["fecha"].ToString()));
                    cot.setMontoTotal(Double.Parse(myReader["montoTotal"].ToString()));
                    cot.setEstado(myReader["estado"].ToString());
                    cot.addNotaCredito( MainController.getNotaCreditoById(Int32.Parse( myReader["idNotaCredito"].ToString() ) )  );
                    cot.addCliente(MainController.getCustomerById(Int32.Parse( myReader["idCliente"].ToString())));
     

                    list.Add(cot);
                }
            }
            catch (Exception e)
            {
                // TODO Auto-generated catch block			
                Console.WriteLine(e.StackTrace); //Se debe manejar con logs
                throw e;
            }
            finally
            {
                //Paso 6. CERRAR LA CONEXIÓN!!!!
                try { if (myReader != null) myReader.Close(); }
                catch (Exception e) { Console.WriteLine(e.StackTrace); }
                try { if (conn != null) conn.Close(); }
                catch (Exception e) { Console.WriteLine(e.StackTrace); }
            }
            return list;
        }
        public List<Cotizacion> queryAllbyCliente(int idCliente)
        {
            List<Cotizacion> list = new List<Cotizacion>();
            SqlConnection conn = null;
            SqlDataReader myReader = null;
            try
            {
                //Paso 1 y 2: Registrar el driver y obtener la conexión
                conn = new SqlConnection();
                conn.ConnectionString = "Server=inti.lab.inf.pucp.edu.pe;" +
                    "Database=inf282;User ID=inf282;Password=inf282db;";
                conn.Open();

                //Paso 3. Preparar la sentencia
                SqlCommand comm = new SqlCommand();
                comm.Connection = conn;
                comm.CommandText = "SELECT * FROM BooxCotizacion WHERE idCliente=@param1";

                SqlParameter param1 = new SqlParameter("@param1",
                                                        System.Data.SqlDbType.Int);
                param1.Value = idCliente;
                comm.Parameters.Add(param1);
                //Paso 4. Ejecutar la sentencia
                myReader = comm.ExecuteReader();

                //Paso 5: Evaluar los resultados
                while (myReader.Read())
                {
                    Cotizacion cot = new Cotizacion();
                    cot.setId(Int32.Parse(myReader["id"].ToString()));
                    cot.setFecha(DateTime.Parse(myReader["fecha"].ToString()));
                    cot.setMontoTotal(Double.Parse(myReader["montoTotal"].ToString()));
                    cot.setEstado(myReader["estado"].ToString());
                    cot.addNotaCredito(MainController.getNotaCreditoById(Int32.Parse(myReader["idNotaCredito"].ToString())));
                    cot.addCliente(MainController.getCustomerById(idCliente));

                    list.Add(cot);
                }
            }
            catch (Exception e)
            {
                // TODO Auto-generated catch block			
                Console.WriteLine(e.StackTrace); //Se debe manejar con logs
                throw e;
            }
            finally
            {
                //Paso 6. CERRAR LA CONEXIÓN!!!!
                try { if (myReader != null) myReader.Close(); }
                catch (Exception e) { Console.WriteLine(e.StackTrace); }
                try { if (conn != null) conn.Close(); }
                catch (Exception e) { Console.WriteLine(e.StackTrace); }
            }
            return list;
        }
        public Cotizacion queryById(int cotizacionId)
        {
            Cotizacion cot = null;
            SqlConnection conn = null;
            SqlDataReader myReader = null;
            try
            {
                //Paso 1 y 2: Registrar el driver y obtener la conexión
                conn = new SqlConnection();
                conn.ConnectionString = "Server=inti.lab.inf.pucp.edu.pe;" +
                    "Database=inf282;User ID=inf282;Password=inf282db;";
                conn.Open();

                //Paso 3. Preparar la sentencia
                SqlCommand comm = new SqlCommand();
                comm.Connection = conn;
                comm.CommandText = "SELECT * FROM BooxCotizacion WHERE id=@param1";
                SqlParameter param1 = new SqlParameter("@param1",
                                                        System.Data.SqlDbType.Int);
                param1.Value = cotizacionId;
                comm.Parameters.Add(param1);

                //Paso 4. Ejecutar la sentencia
                myReader = comm.ExecuteReader();

                //Paso 5: Evaluar los resultados
                if (myReader.Read())
                {
                    cot = new Cotizacion(); 
                    cot.setId(Int32.Parse(myReader["id"].ToString()));
                    cot.setFecha(DateTime.Parse(myReader["dni"].ToString()) );
                    cot.setMontoTotal(Double.Parse(myReader["direccion"].ToString() ));
                    cot.setEstado(myReader["email"].ToString());
                    cot.addNotaCredito(MainController.getNotaCreditoById(Int32.Parse(myReader["idNotaCredito"].ToString())));
                    cot.addCliente(MainController.getCustomerById(Int32.Parse( myReader["idCliente"].ToString())));
                    
                }
            }
            catch (Exception e)
            {
                // TODO Auto-generated catch block			
                Console.WriteLine(e.StackTrace); //Se debe manejar con logs
                throw e;
            }
            finally
            {
                //Paso 5. CERRAR LA CONEXIÓN!!!!
                try { if (myReader != null) myReader.Close(); }
                catch (Exception e) { Console.WriteLine(e.StackTrace); }
                try { if (conn != null) conn.Close(); }
                catch (Exception e) { Console.WriteLine(e.StackTrace); }
            }
            return cot;
        }
        public List<Cotizacion> queryByDateRange(DateTime s, DateTime f)
        {
            List<Cotizacion> list = new List<Cotizacion>();
            SqlConnection conn = null;
            SqlDataReader myReader = null;
            try
            {
                //Paso 1 y 2: Registrar el driver y obtener la conexión
                conn = new SqlConnection();
                conn.ConnectionString = "Server=inti.lab.inf.pucp.edu.pe;" +
                    "Database=inf282;User ID=inf282;Password=inf282db;";
                conn.Open();

                //Paso 3. Preparar la sentencia
                SqlCommand comm = new SqlCommand();
                comm.Connection = conn;
                comm.CommandText = "SELECT * FROM BooxCotizacion WHERE fecha BETWEEN @param1 AND @param2";

                SqlParameter param1 = new SqlParameter("@param1", System.Data.SqlDbType.DateTime);
                SqlParameter param2 = new SqlParameter("@param2", System.Data.SqlDbType.DateTime);

                param1.Value = s;
                param2.Value = f;

                comm.Parameters.Add(param1);
                comm.Parameters.Add(param2);

                //Paso 4. Ejecutar la sentencia
                myReader = comm.ExecuteReader();

                //Paso 5: Evaluar los resultados
                while (myReader.Read())
                {
                    Cotizacion c = new Cotizacion();
                    c.setId(Int32.Parse(myReader["id"].ToString()));
                    c.setFecha(DateTime.Parse(myReader["fecha"].ToString()));
                    c.setEstado(myReader["estado"].ToString());
                    c.setMontoTotal(Double.Parse(myReader["montoTotal"].ToString()));
                    c.addCliente(MainController.getCustomerById(Int32.Parse(myReader["idCliente"].ToString())));
                    c.addNotaCredito(MainController.getNotaCreditoById(Int32.Parse(myReader["idNotaCredito"].ToString())));
                    list.Add(c);
                }
            }
            catch (Exception e)
            {
                // TODO Auto-generated catch block			
                Console.WriteLine(e.StackTrace); //Se debe manejar con logs
                throw e;
            }
            finally
            {
                //Paso 6. CERRAR LA CONEXIÓN!!!!
                try { if (myReader != null) myReader.Close(); }
                catch (Exception e) { Console.WriteLine(e.StackTrace); }
                try { if (conn != null) conn.Close(); }
                catch (Exception e) { Console.WriteLine(e.StackTrace); }
            }
            return list;
        }
        public int count()
        {
            int quantity = 0;
            SqlConnection conn = null;
            SqlDataReader myReader = null;
            try
            {
                //Paso 1 y 2: Registrar el driver y obtener la conexión
                conn = new SqlConnection();
                conn.ConnectionString = "Server=inti.lab.inf.pucp.edu.pe;" +
                    "Database=inf282;User ID=inf282;Password=inf282db;";
                conn.Open();

                //Paso 3. Preparar la sentencia
                SqlCommand comm = new SqlCommand();
                comm.Connection = conn;
                comm.CommandText = "SELECT Count(1) AS quantity FROM BooxCotizacion";
                //Paso 4. Ejecutar la sentencia
                myReader = comm.ExecuteReader();

                //Paso 5: Evaluar los resultados
                if (myReader.Read())
                {
                    quantity = Int32.Parse(myReader["quantity"].ToString());
                }
            }
            catch (Exception e)
            {
                // TODO Auto-generated catch block			
                Console.WriteLine(e.StackTrace); //Se debe manejar con logs
                throw e;
            }
            finally
            {
                //Paso 5. CERRAR LA CONEXIÓN!!!
                try { if (myReader != null) myReader.Close(); }
                catch (Exception e) { Console.WriteLine(e.StackTrace); }
                try { if (conn != null) conn.Close(); }
                catch (Exception e) { Console.WriteLine(e.StackTrace); }
            }
            return quantity;
        }
    }
}
